home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_se / expression.e < prev    next >
Text File  |  2000-03-25  |  12KB  |  445 lines

  1. --          This file is part of SmallEiffel The GNU Eiffel Compiler.
  2. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  3. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr
  4. --                       http://SmallEiffel.loria.fr
  5. -- SmallEiffel is  free  software;  you can  redistribute it and/or modify it
  6. -- under the terms of the GNU General Public License as published by the Free
  7. -- Software  Foundation;  either  version  2, or (at your option)  any  later
  8. -- version. SmallEiffel is distributed in the hope that it will be useful,but
  9. -- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. -- or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU General Public License
  11. -- for  more  details.  You  should  have  received a copy of the GNU General
  12. -- Public  License  along  with  SmallEiffel;  see the file COPYING.  If not,
  13. -- write to the  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  14. -- Boston, MA 02111-1307, USA.
  15. --
  16. deferred class EXPRESSION
  17.    --
  18.    -- Any kind of Eiffel expression.
  19.    --
  20.  
  21. inherit GLOBALS;
  22.  
  23. feature
  24.  
  25.    start_position: POSITION is
  26.          -- Of the expression if any.
  27.       deferred
  28.       end;
  29.  
  30.    is_current: BOOLEAN is
  31.          -- Is it a `Current' like expression (really written 
  32.          -- `Current' or some implicit non-written `Current') ?
  33.       deferred
  34.       end;
  35.  
  36.    is_manifest_string: BOOLEAN is
  37.          -- Is it a manifest string ?
  38.       deferred
  39.       end;
  40.  
  41.    is_manifest_array: BOOLEAN is
  42.          -- Is it a manifest array ?
  43.       deferred
  44.       end;
  45.  
  46.    is_void: BOOLEAN is
  47.          -- Is it the built-in Void ?
  48.       deferred
  49.       end;
  50.  
  51.    is_result: BOOLEAN is
  52.          -- Is it the pseudo local variable `Result' ?
  53.       deferred
  54.       end;
  55.  
  56.    is_writable: BOOLEAN is
  57.          -- Is is something that one can find on the left-hand-side 
  58.          -- of the := operator ?
  59.       deferred
  60.       end;
  61.  
  62.    static_result_base_class: BASE_CLASS is
  63.          -- The static BASE_CLASS of the `result_type' (according to the
  64.          -- `start_position').
  65.          -- Void when it is too difficult to compute, when some error 
  66.          -- occurs or when this is the class NONE.
  67.       deferred
  68.       end;
  69.  
  70.    result_type: TYPE is
  71.          -- The `result_type' is available only when the expression 
  72.          -- has been checked (see `to_runnable').
  73.       deferred
  74.       ensure
  75.          Result /= Void
  76.       end;
  77.  
  78.    use_current: BOOLEAN is
  79.          -- True if `Current' is used.
  80.          -- As for `result_type', available only for checked expression.
  81.       require
  82.          small_eiffel.is_ready
  83.       deferred
  84.       end;
  85.  
  86.    stupid_switch(r: ARRAY[RUN_CLASS]): BOOLEAN is
  87.       require
  88.          small_eiffel.is_ready;
  89.          run_control.boost;
  90.          r.count > 1
  91.       deferred
  92.       end;
  93.  
  94.    to_runnable(ct: TYPE): EXPRESSION is
  95.          -- Gives the corresponding expression checked in `ct'.
  96.       require
  97.          ct.run_type = ct;
  98.          ct.run_class /= Void
  99.       deferred
  100.       ensure
  101.          nb_errors = 0 implies Result.result_type.is_run_type
  102.       end;
  103.  
  104. feature
  105.  
  106.    isa_dca_inline_argument: INTEGER is
  107.          -- Interpretation of the Result :
  108.          --    -1 : yes and no ARGUMENT_NAME used
  109.          --     0 : not inlinable
  110.          --   > 0 : inlinable and ARGUMENT_NAME rank is used.
  111.       require
  112.          run_control.boost and small_eiffel.is_ready
  113.       deferred
  114.       ensure
  115.          Result >= -1
  116.       end;
  117.  
  118.    dca_inline_argument(formal_arg_type: TYPE) is
  119.       require
  120.          formal_arg_type /= Void;
  121.          isa_dca_inline_argument /= 0
  122.       deferred
  123.       end;
  124.  
  125.    assertion_check(tag: CHARACTER) is
  126.          -- Assume the current code in inside some assertion (a
  127.          -- require clause or some class invariant for example)..
  128.          -- The `tag' mangling is :
  129.          --   'R' when we are inside some require clause.
  130.          --   'E' when we are inside some ensure clause.
  131.          --   '_' for all other assertions.
  132.          -- This flag is used to check VAPE and VEEN as well.
  133.       require
  134.          run_control.no_check;
  135.          ("RE_").has(tag)
  136.       deferred
  137.       end;
  138.  
  139. feature  -- Handling of precedence (priority of expressions) :
  140.  
  141.    precedence: INTEGER is
  142.       deferred
  143.       ensure
  144.          1 <= Result and Result <= atomic_precedence
  145.       end;
  146.  
  147. feature
  148.  
  149.    frozen add_comment(c: COMMENT): EXPRESSION is
  150.          -- Attach `c' to the receiver.
  151.       do
  152.          if c = Void or else c.count = 0 then
  153.             Result := Current;
  154.          else
  155.             !EXPRESSION_WITH_COMMENT!Result.make(Current,c);
  156.          end;
  157.       end;
  158.  
  159.    frozen base_class_written: BASE_CLASS is
  160.          -- The base class where this expression is written.
  161.       do
  162.          Result := start_position.base_class;
  163.       end;
  164.  
  165.    frozen written_in: CLASS_NAME is
  166.          -- The name of the base class where this expression is written.
  167.       do
  168.          Result := start_position.base_class_name;
  169.       end;
  170.  
  171.    afd_check is
  172.          -- After Falling Down Check.
  173.       deferred
  174.       end;
  175.  
  176. feature -- To produce C code :
  177.  
  178.    collect_c_tmp is
  179.          -- Traverse the expression to collect needed C tmp variables
  180.          -- just before `compile_to_c'.
  181.       require
  182.          small_eiffel.is_ready
  183.       deferred
  184.       end;
  185.  
  186.    compile_to_c is
  187.          -- Produce C code to access the value of the Current
  188.          -- expression : user's expanded are no longuer pointer.
  189.       require
  190.          small_eiffel.is_ready;
  191.          cpp.on_c
  192.       deferred
  193.       ensure
  194.          cpp.on_c
  195.       end;
  196.  
  197.    mapping_c_target(formal_type: TYPE) is
  198.          -- Produce C code in order to pass Current expression as
  199.          -- the target of a feature call.
  200.          -- When it is needed, C code to check invariant is
  201.          -- automatically added as well as a C cast according to
  202.          -- the destination `formal_type'.
  203.       require
  204.          small_eiffel.is_ready;
  205.          formal_type.at_run_time
  206.       deferred
  207.       end;
  208.  
  209.    mapping_c_arg(formal_arg_type: TYPE) is
  210.          -- Produce C code in order to pass Current expression as an
  211.          -- argument of the feature called.
  212.          -- Thus, it is the same jobs as `mapping_c_target' without
  213.          -- the invariant call.
  214.       require
  215.          small_eiffel.is_ready
  216.       deferred
  217.       end;
  218.  
  219.    c_declare_for_old is
  220.          -- Produce C code to declare `old' expression variables.
  221.       require
  222.          small_eiffel.is_ready;
  223.          cpp.on_c
  224.       deferred
  225.       ensure
  226.          cpp.on_c
  227.       end;
  228.  
  229.    compile_to_c_old is
  230.          -- Produce C code to memorize `old' expression values.
  231.       require
  232.          small_eiffel.is_ready;
  233.          cpp.on_c
  234.       deferred
  235.       ensure
  236.          cpp.on_c
  237.       end;
  238.  
  239. feature  -- To produce C code :
  240.  
  241.    c_simple: BOOLEAN is
  242.          -- True when the C code of `compile_c' has no side effect at
  243.          -- and `compile_to_c' on the corresponding simple expression
  244.          -- can be called more than once without any problem.
  245.       deferred
  246.       end;
  247.  
  248.    can_be_dropped: BOOLEAN is
  249.          -- True if evaluation of current expression has NO possible
  250.          -- side effects. Thus, in such a case, an unused expression
  251.          -- can be dropped (for example target of real procedure or
  252.          -- real function).
  253.       require
  254.          small_eiffel.is_ready
  255.       deferred
  256.       end;
  257.  
  258. feature  -- Finding `int' Constant C expression :
  259.  
  260.    is_static: BOOLEAN is
  261.          -- True if expression has always the same static
  262.          -- value: INTEGER or BOOLEAN value is always the same
  263.          -- or when reference is always the same (Void or the
  264.          -- same manifest string for example).
  265.       require
  266.          small_eiffel.is_ready
  267.       deferred
  268.       end;
  269.  
  270.    static_value: INTEGER is
  271.          -- Note: the result could be an EXPRESSION ... it seems
  272.          -- to be a good idea.
  273.       require
  274.          is_static
  275.       deferred
  276.       end;
  277.  
  278.    is_pre_computable: BOOLEAN is
  279.          -- Can the current expression be pre-computed in main
  280.          -- function to speed up a once function ?
  281.       require
  282.          small_eiffel.is_ready
  283.       deferred
  284.       end;
  285.  
  286. feature -- For `compile_to_jvm' :
  287.  
  288.    compile_to_jvm is
  289.          -- Produce Java byte code in order to push expression value
  290.          -- on the jvm stack.
  291.       require
  292.          small_eiffel.is_ready
  293.       deferred
  294.       end;
  295.  
  296.    compile_target_to_jvm is
  297.          -- Same as `compile_to_jvm', but add class invariant check
  298.          -- when needed.
  299.       require
  300.          small_eiffel.is_ready
  301.       deferred
  302.       end;
  303.  
  304.    compile_to_jvm_old is
  305.          -- Produce Java byte code to memorize `old' expression values.
  306.       require
  307.          small_eiffel.is_ready
  308.       deferred
  309.       end;
  310.  
  311.    compile_to_jvm_into(dest: TYPE): INTEGER is
  312.          -- Assume `result_type' conforms to `dest'.
  313.          -- Produce Java byte code in order to convert the expression
  314.          -- into `dest' (comparisons = and /=, argument passing and
  315.          -- assignment).
  316.          -- Result gives the space in the JVM stack.
  317.          -- *** SHOULD BE REMOVE AS SOON AS IMPLICIT_CAST WILL BE 
  318.          --     CORRECT ***
  319.       require
  320.          conversion_check(dest,result_type)
  321.       deferred
  322.       ensure
  323.          Result >= 1
  324.       end;
  325.  
  326.    frozen standard_compile_target_to_jvm is
  327.       do
  328.          compile_to_jvm;
  329.          result_type.jvm_check_class_invariant;
  330.       end;
  331.  
  332.    frozen standard_compile_to_jvm_into(dest: TYPE): INTEGER is
  333.       require
  334.          conversion_check(dest,result_type)
  335.       do
  336.          compile_to_jvm;
  337.          Result := result_type.run_type.jvm_convert_to(dest);
  338.       ensure
  339.          Result >= 1
  340.       end;
  341.  
  342.    conversion_check(dest, rt: TYPE): BOOLEAN is
  343.       do
  344.          Result := true;
  345.          if rt.is_a(dest) then
  346.          else
  347.             eh.cancel;
  348.             if dest.is_a(rt) then
  349.             else
  350.                warning(start_position,
  351.                 ". Impossible conversion (EXPRESSION).");
  352.             end;
  353.          end;
  354.       end;
  355.  
  356.    jvm_branch_if_false: INTEGER is
  357.          -- Gives the `program_counter' to be resolved.
  358.       require
  359.          result_type.is_boolean
  360.       deferred
  361.       end;
  362.  
  363.    jvm_branch_if_true: INTEGER is
  364.          -- Gives the `program_counter' to be resolved.
  365.       require
  366.          result_type.is_boolean
  367.       deferred
  368.       end;
  369.  
  370.    jvm_assign is
  371.          -- Basic assignment using value on top of stack.
  372.       require
  373.          is_writable
  374.       deferred
  375.       end;
  376.  
  377. feature {NONE}
  378.  
  379.    frozen jvm_standard_branch_if_false: INTEGER is
  380.          -- Gives the `program_counter' to be resolved.
  381.       require
  382.          result_type.is_boolean
  383.       do
  384.          compile_to_jvm;
  385.          Result := code_attribute.opcode_ifeq;
  386.       end;
  387.  
  388.    frozen jvm_standard_branch_if_true: INTEGER is
  389.          -- Gives the `program_counter' to be resolved.
  390.       require
  391.          result_type.is_boolean
  392.       do
  393.          compile_to_jvm;
  394.          Result := code_attribute.opcode_ifne
  395.       end;
  396.  
  397. feature
  398.  
  399.    to_integer: INTEGER is
  400.       do
  401.          error(start_position,fz_iinaiv);
  402.       end;
  403.  
  404. feature -- Pretty printing :
  405.  
  406.    pretty_print is
  407.          -- Start the `pretty_print' process.
  408.       require
  409.          fmt.indent_level >= 1;
  410.       deferred
  411.       ensure
  412.          fmt.indent_level = old fmt.indent_level;
  413.       end;
  414.  
  415.    print_as_target is
  416.          -- Print the expression viewed as a target plus the
  417.          -- corresponding dot when it is necessary.
  418.       deferred
  419.       end;
  420.  
  421.    bracketed_pretty_print is
  422.          -- Add bracket only when it is necessary.
  423.       deferred
  424.       end;
  425.  
  426. feature -- For `short' :
  427.  
  428.    short is
  429.       deferred
  430.       end;
  431.  
  432.    short_target is
  433.          -- A target with the following dot if needed.
  434.       deferred
  435.       end;
  436.  
  437.    frozen bracketed_short is
  438.       do
  439.          short_print.hook_or("open_b","(");
  440.          short;
  441.          short_print.hook_or("close_b",")");
  442.       end;
  443.  
  444. end -- EXPRESSION
  445.